package com.xue566.config;

import com.xue566.enums.StateEnum;
import com.xue566.util.ResultBody;
import com.xue566.util.StateException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;


/**
 * @Author: Wuzh
 * @Description:
 * @ControllerAdvice: 这是一个非常有用的注解，顾名思义，这是一个增强的 Controller。使用这个 Controller
 * @Date Created in 22:53 2020/8/18
 * @return
 */
@ControllerAdvice
@Slf4j
public class GlobalExceptionHandler {

    /**
     * 处理自定义的业务异常
     * @param e
     * @ExceptionHandler: 注解用来指明异常的处理类型，即如果这里指定为 NullPointerException，则数组越界异常就不会进到这个方法中来。
     * 拦截所有StateException异常
     */
    @ExceptionHandler(value = StateException.class)
    @ResponseBody
    public ResultBody businessExceptionHandler (StateException e) {
        log.error("发生业务异常 - {}", e.getMessage());
        return ResultBody.fail(e.getCode(), e.getMessage());
    }

    /**
     * 处理空指针的异常
     * @param e
     */
    @ExceptionHandler(value = NullPointerException.class)
    @ResponseBody
    public ResultBody exceptionHandler (NullPointerException e) {
        log.error("发生空指针异常 - {}:", e);
        return ResultBody.fail(StateEnum.REQUEST_PARAM_EXCE.getCode(), "空指针异常");
    }


    /**
     * 处理其他异常
     * @param e
     */
    @ExceptionHandler(value = Exception.class)
    @ResponseBody
    public ResultBody exceptionHandler (Exception e) {
        log.error("未知异常 - {}", e);
        return ResultBody.fail(StateEnum.ERROR.getCode(), StateEnum.ERROR.getMessage());
    }
}
